home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1996 April
/
CHIP 1996 aprilis (CD06).zip
/
CHIP_CD06.ISO
/
hypertxt.arj
/
9301
/
SZIMU3.CD
< prev
next >
Wrap
Text File
|
1995-04-18
|
25KB
|
574 lines
@VSzimuláció 3.@N
@VA versengés folytatódik...@N
Sorozatunk második részében belekezdtünk az élet -- a
születés és halál -- statisztikai modellezésébe. Egy
egyszerû demográfiai modellt alkottunk, majd fajok
együttélését vizsgáltuk egy játékos, ámde meglepôen
valósághû eredményt szolgáltató -- nyulak, rókák, káposzták
együttesét szimuláló -- modellen. Most ugyanezt a kérdést,
fajok együttélését/versengését fogjuk elemezni -- némileg
más, szándékunk szerint pontosabb megközelítést alkalmazva.
@VKinn a bárány, benn a farkas@N
A novemberi számunkban ismertetett nyúl-róka (N-R)
modellben szereplôink röghöz voltak kötve, nem volt mozgást
megvalósító lépés, eljárás. A születés, és halál szorosan a
táplálékszerzéshez kötôdött: csak éhhalál vagy erôszakos
halál létezett; szaporodásra pedig csak frissiben jóllakott
egyedek voltak képesek, nem beszélve arról, hogy a
tápláléklánc utolsó eleme, a káposzta meglehetôsen
gátlástalanul (tudniillik minden üres helyet kihasználva)
szaporodott. E hiányosságokat próbáljuk most kiküszöbölni,
elôre bocsájtva, hogy az új modellen is lesz (lehet) még
mit finomítani. Mit kell tudnunk tehát e szép, új világról?
Immár megszokott, sakktáblaszerû univerzumunkat megint
három fajhoz tartozó élôlény népesíti be. A ragadozókat
képviselik a farkasok (F); a növényevôk bárányok (B)
képében vannak jelen; míg a növényvilágot egyszerûen (s
némileg kényszeredetten) gaznak (G) nevezzük. A "teremtés"
során meghatározzuk az egyes fajokhoz tartozó egyedek
számát (FDB, BDB, GDB), majd benépesítjük velük - praktikus
okokból véletlenszerûen - a világot, azaz a V(N,M)
karakteres tömböt. Hogy a születés és a halál elôbb
említett korlátait csökkentsük, vezessünk be a farkasok,
bárányok illetve a gaz szaporodására, fogyására rájuk
jellemzô állandókat, melyek az illetô esemény
valószínûségét hivatottak megadni. îgy lesz "természetes"
halál és étkezéstôl független szaporodás is a modellben,
meghagyva a nyúl-róka modellbôl természetesen azt, hogy ha
nem található valamelyik szereplô szomszédságában az ô
tápláléka, akkor bizony éhenhal; illetve a "táplálék"
életének végét jelenti, ha a "fogyasztója" szomszédjává
tette rossz sorsa. Az említett állandók jele legyen rendre
FS, BS, GS, FH, BH, GH. Értéküket szintén a teremtési
fázisban kell megadnunk, bár konstansként is szerepelhetnek
programunkban. Ennyi elôkészítés után lássuk programunk
magját, a szimulációs lépést. (Maga a keretprogram, melyet
most is felhasználhatunk, októberi számunkban található).
Szimulációs lépés;
(I,J) := Véletlenhely(N,M)
Esetszétválasztás:
V(I,J) = "F" esetén Farkaseljárás;
V(I,J) = "B" esetén Bárányeljárás;
V(I,J) = "G" esetén Gazeljárás;
Esetszétválasztás vége
Mozgás
Szimulációs lépés vége;
Ez eddig még nem sokat mond a várható történésekrôl, a
modell szabályairól. A mûködés lényege nyilván az egyes
al-eljárásokban lesz (az ördög is mindig a részletekben
bújik meg), tehát lássuk az egyes eseteknek megfelelô
"egyedkezelô" algoritmusokat.
Farkaseljárás;
Van := Van_e_szomszéd_táplálék(I,J,"F","B");
Ha Van akkor (K,L) := Egy_szomszéd_táplálékhely(I,J,"B");
Ha RND < FH vagy nem(Van) akkor V(I,J) := "_"
FDB := FDB - 1;
különben
Ha RND < FS akkor
T(K,L) := "F"
FDB := FDB + 1;
különben
T(K,L) := "_"
BDB := BDB -1;
Farkaseljárás vége;
Tehát egy farkas éhenhal, ha nincs elérhetô közelségben
bárány, de rögzített eséllyel (FH) aggkori végelgyengülés
is végezhet vele, hiába veszi körül kivánatos bárányok
tömege. Az ezt túlélô farkas a bárányok legnagyobb
bánatára mindenképpen táplákozik, de szaporodásra csak
meghatározott esetekben (adott valószínûséggel - FS)
kapható. Az értelemszerû módosításokat figyelembe véve
hasonló szerkezetû a bárányok változását generáló eljárás
is:
Bárányeljárás;
Van := Van_e_szomszéd_táplálék(I,J,"B","G");
Ha Van akkor
(K,L) := Egy_szomszéd_táplálékhely(I,J,"G");
Ha RND < BH vagy nem(Van) akkor
V(I,J) := "_";
BDB := BDB - 1;
különben
Ha RND < BS akkor
T(K,L) := "B";
BDB := BDB + 1;
különben
T(K,L) := "_"
GDB := GDB -1;
Bárányeljárás vége;
Kicsivel több módosítást igényel a növényzet
állapotváltozásait (gyarapodását, fogyását) leíró,
elôállító "Gazeljárás" leírása, hiszen a fû a tápláléklánc
végén található, s a fentiekben tisztázott eseten
(tudniillik a bárány pusztítja gyepet), már csak a
kiszáradás fenyegetô veszélyét kell figyelembe vennünk:
Gazeljárás;
Van := Van_e_szomszéd_táplálék(I,J,"G","_")
Ha Van akkor
(K,L) := Egy_szomszéd_táplálékhely(I,J,"_");
Ha RND < GH akkor
V(I,J) := "_"
GDB := GDB - 1;
különben
Ha RND < GS és Van akkor
T(K,L) := "G"
GDB := GDB + 1;
Gazeljárás vége;
Itt elgondolkodhatunk egy másik alternatíván is: a fenti
eljárásban a gaz csak a szomszédban képes szaporodni. Miért
ne hordhatná el a szél messzebbre is a magokat? Azaz a
legelô gyarapodásához szükséges üres helyet a táblázat
egészén keresnénk, amitôl modellünk mozgalmasabbá, és
egyben kiszámíthatatlanabbá is válna. Szintén változást
eredményezhet világunk történelmében a szomszédság
értelmezése: dolgozhatunk a szomszédkezelô eljárásokban
(Van_e_szomszédtáplálék, Egy_szomszéd_táplálékhely) négy,
illetve nyolc szomszéddal, ezáltal végeredményben módosítva
a túlélési, pusztulási esélyeket. Hasonlóan többféleképpen
közelíthetünk a még hátralévô "Mozgás" eljáráshoz. Hiszen
írható egy ilyen rövid, egyszerû eljárás:
Mozgás;
(X,Y) := Véletlenhely(N,M);
(U,V) := Véletlenhely(N,M);
Ha V(X,Y) <> "G" és V(U,V) <> "G" akkor
Csere(V(X,Y),V(U,V));
Mozgás vége;
Ez egyszerû, véletlen által irányított cserét jelent
helyváltoztatásra egyáltalán képes egyedek (azaz a
farkasok, bárányok) között. Mondhatnánk erre, hogy nem
igazán valószerû, amint a farkas-bárány csere lezajlik;
legyen a mozgás egy egyedi, véletlen, de üres helyre
történô elmozdulás. Ez is egy lehetôség, de vélhetôen
pontosabb képet hozunk létre, ha a mozgást irányultnak,
vagy másképpen fogalmazva tudatosabbnak tekintjük. Ezt is
több módon tehetjük meg. Hiszen mozoghat a farkas a bárány,
a bárány pedig a gaz felé, azaz a jobb életfeltételek, a
több táplálék irányába. De a bárány foghatja menekülôre is:
olyan helyre mozdul, ahol kevesebb (vagy egyáltalán nincs)
farkas a környéken. De a bárányokon kiütközhet a
nyájszellem (a farkasok pedig itélhetik elônyösebbnek a
hordát), tehát úgy mozognak, hogy fajtestvéreik közelében
legyenek. Érdemes ezeket a lehetôségeket megírni,
beprogramozni. Mint ahogy érdemes a táblázat egyszerû
kiiratása mellett a folyamatosan változó létszámadatokat
(FDB, BDB, GDB), grafikonon is megjeleníteni, s ezáltal a
jelenségeket szemléletesen, jól láthatóan ábrázolni.
program egyutteles_2_v3;
[Nagy2Gábor
[A gazt viszi a szél, állatok elmennek, ha nincs táplálék@N
uses crt,graph;
const fs=70; fh=12; bs=80; bh=10; gs=80;
gh=14;
type t1=array[1..20,1..20 of char;
var s,o,y,fdb,bdb,gdb:word;
van:boolean;
biz:string[3@N;
c,d:shortint;
a,b,kap:byte;
v:t1;
kar:char;
q,qq,code:integer;
fdbs,bdbs,gdbs:string;
function kontroll(min,max:word; szoveg:string):word;
var a:word;
begin
[adatbevitel ellenôrzése
repeat
gotoxy(10,10);
write(szoveg,
'(min:',min,';max:',max,'):');
readln(biz); val(biz,a,code); clrscr;
until (code=0) and (a<=max) and (a>min);
kontroll:=a;
end;
procedure kezdet;
begin
clrscr;
writeln('Együttélés-2:Farkas-Bárány-Gaz');
write('A gazt viszi a szél, állatok');
writeln(' elmennek, ha nincs táplálék');
o:=kontroll(5,20,'oszlop');
s:=kontroll(5,20,'sor');
for a:=1 to o do
for b:=1 to s do v[a,b:=' ';
fdb:=kontroll(0,o*s,'farkas-szám');
bdb:=kontroll(0,o*s-fdb,'bárány-szám');
gdb:=kontroll(0,o*s-fdb-bdb,'gaz-szám');
end;
procedure tolt2(d:word;e:char);
var c:word;
begin
for c:=1 to d do begin
repeat
a:=random(o)+1; b:=random(s)+1;
until v[a,b@N=' ';
v[a,b:=e;
end;
end;
function van_tapl(a2,b2:byte; kus:char):boolean;
var k:byte;
begin
[van-e ehetô szomszéd@N
c:=-2; k:=0;
repeat
c:=c+1; d:=-2;
repeat
d:=d+1;
if (a2+c<=o) and (a2+c>0) and
(b2+d>0) and (b2+d<=s) then
if v[a2+c,b2+d@N=kus then k:=1;
until (d=1) or (k=1);
until (c=1) or (k=1);
if k=1 then van_tapl:=true
else van_tapl:=false;
end;
procedure szomszed(a2,b2:byte;kus:char);
begin
[ehetô szomszéd adatai
repeat
repeat
c:=random(3)-1; d:=random(3)-1;
until (a2+c<=o) and (a2+c>0) and
(b2+d>0) and (b2+d<=s);
until v[a2+c,b2+d=kus;
end;
procedure gazhova;
var e:byte;
begin
[egy üres hely a születendô fûnek@N
e:=0;
repeat
e:=e+1; c:=random(o)+1; d:=random(s)+1;
until (e=8) or (v[c,d@N=' ');
if v[c,d=' ' then van:=true
else van:=false;
c:=c-a; d:=d-b;
end;
procedure kozos(ante,el:char;sz,ha:byte);
var vel:byte;
begin
if el='g' then gazhova
else begin
van:=van_tapl(a,b,ante);
if van then szomszed(a,b,ante);
end;
vel:=random(100)+1;
[halálozás
if (vel<=ha) or ((van=false) and
(el<>'g')) then begin
v[a,b@N:=' ';
case el of
'f':fdb:=fdb-1;
'b':bdb:=bdb-1;
'g':gdb:=gdb-1;
end;
end
else begin
vel:=random(100)+1;
[születés@N
if vel<=sz then if van then begin
v[a+c,b+d:=el;
case el of
'f':begin
bdb:=bdb-1;
fdb:=fdb+1;
end;
'b':begin
bdb:=bdb+1;
gdb:=gdb-1;
end;
'g':gdb:=gdb+1;
end;
end;
[ehetô szomszéd meghal,ha nincs szülés
if vel>sz then if van then begin
v[a+c,b+d@N:=' ';
case el of
'f':bdb:=bdb-1;
'b':gdb:=gdb-1;
end;
end;
end;
end;
procedure mozgas;
var hj:char;
begin;
repeat
a:=random(o)+1; b:=random(s)+1;
until (v[a,b='f') or (v[a,b@N='b');
case v[a,b of
'f':hj:='b';
'b':hj:='g';
end;
c:=random(o)+1;
d:=random(s)+1;
[csere@N
if van_tapl(a,b,hj)=false then begin
hj:=v[a,b@N; v[a,b:=v[c,d@N; v[c,d:=hj;
end;
end;
procedure param;
var ey:char;
begin
a:=random(o)+1; b:=random(s)+1;
[kozos(ehetô szomszéd,v[a,b@N,
szül.arány,hal.arány
case v[a,b of
'f':kozos('b','f',fs,fh);
'b':kozos('g','b',bs,bh);
'g':kozos(' ','g',gs,gh);
end;
if v[a,b@N<>' ' then mozgas;
end;
procedure alap;
var o:word;
begin
line(50,1,50,305); line(50,101,600,101);
line(50,203,600,203);line(50,305,600,305);
outtextxy(2,30,'farkas');
outtextxy(2,130,'bárány');
outtextxy(2,230,'gaz');
outtextxy(80,320,'Vége: o');
outtextxy(250,320,'Grafikon tovább: i');
end;
procedure kirajzol;
begin
putpixel(y,304-round(gdb/(o*s)*100),3);
putpixel(y,202-round(bdb/(o*s)*100),3);
putpixel(y,100-round(fdb/(o*s)*100),3);
end;
procedure kiir2;
begin
str(fdb,fdbs); outtextxy(620,60,fdbs);
str(bdb,bdbs); outtextxy(620,150,bdbs);
str(gdb,gdbs); outtextxy(620,250,gdbs);
end;
procedure rajz;
begin
q:=0; qq:=0;
initgraph(q,qq,'d:\tp\bgi');
settextstyle(2,0,5);
alap;
repeat
y:=50;
[régi grafikonok letörlése@N
setfillstyle(1,0); bar(51,1,600,100);
bar(51,102,600,202);
bar(51,204,600,304); setfillstyle(1,1);
repeat
y:=y+1;
param;
kirajzol;
if kap=1 then begin
setfillstyle(1,0); bar(620,50,650,270);
setfillstyle(1,1); kiir2;
end;
until (keypressed) or (y=600);
if (y=600) then begin
repeat kar:=readkey;
until (kar='o') or (kar='i');
end
else kar:=readkey;
until kar='o';
closegraph;
end;
begin
gdb:=0; bdb:=0; fdb:=0;
randomize; kezdet;
tolt2(fdb,'f'); tolt2(bdb,'b');
tolt2(gdb,'g');
repeat
clrscr;
write('1. Numerikus kijelzés is');
writeln(' legyen - lassu!');
write('2. Csak grafikon legyen');
writeln('- gyors!');
write('Tehát? '); readln(kap); rajz;
until kar='o';
end.
A mellékelt Pascal nyelvû program (ld. lista) ezt valósítja
meg: három párhuzamosan futó grafikonon követhetjük nyomon
az egyes fajok népességét, azok alakulásának egymásra
hatását. A programban adott születési-halálozási
valószínûségeket használva egy 20x20-as "világban", igen
látványos, hosszú életû modelleket kapunk a farkasok,
bárányok és "gazok" számának rendre a 100, 100, 200 illetve
a 80, 150, 170 értékeket adva. A programban a fûmagokat a
szél messzire viheti, s az állatok elmenekülnek arról a
helyrôl, ahol nincs táplálék. Egészen más a futási
eredmény, mint a szomszédsághoz kötött, "buta" állatok
esetében! Persze még itt sincs a dolognak vége:
gondoskodhatnánk öregedésrôl is, az egyes generációkhoz
eltérô szaporodási, halálozási valószínûségeket rendelve,
és így tovább ...
@VA nagy játszma@N
Valahol Földünk globális problémái is hasonlóak. Az
emberiséget a túlnépesedés, a demográfiai robbanás veszélye
fenyegeti @<9301\EMBIC.GIF>(lásd az ábrát),@N
mivel a születési arányszám jelentôsen meghaladja a
halálozási rátát. (Közbevetôleg: ez nem azt jelenti, hogy
az emberiség szaporasága változott volna meg drámaian; az
arányeltolódás igazi oka a halálozási arány jelentôs
csökkenése mind a csecsemôkorban, mind az életkor végén,
azaz a várható élettartam jelentôs növekedése). De
tapasztaljuk bolygónkon az ellenkezô jelenséget is: a
környezetvédelem elôtérbe kerülése, fokozódó megerôsödése
ellenére állati, növényi fajok jutnak el a kipusztulás
határára, vagy tüntek el már véglegesen a globális
történelem süllyesztôjében. Jogos tehát a kérdés: hogyan
biztosítható egy faj tartós fennmaradása, az egyensúly
állapota, a stabilitás?
Kezdjünk bele - Eigen professzor könyve nyomán - egy
elvont, de talán izgalmas kockajátékba, a születés és az
elmúlás globális játszmájának modellezésébe. A két
"játékos" (élet és halál) elôtt három alternatív lehetôség
áll, három stratégia között választhatnak, attól függôen,
hogy hogyan reagálnak az egyedek számának változására.
1. A születés (vagy a halálozás) gyakorisága a populáció
nagyságától függ, úgy hogy a gyakoriság változása azonos
irányú a népesség változásával. Magyarán a lakosság
számának növekedtével a születések (halálozások)
gyakorisága is emelkedik, a népesség fogyásával pedig
csökken. Ez -- a továbbiakban "konform" stratégiának
nevezett, ""S+"-szal jelölt -- stratégia a természetben
meglehetôsen gyakori, majdnem kizárólagos. De az élettelen
világban is találhatunk rá példát: a radioaktív bomlás
jelenségénél (mint már korábban utaltunk rá) az idôegység
alatt elbomló atommagok száma a magok számával arányos.
Érdemes végiggondolni, hogy míg a születések fenti
értelemben konform volta az egyensúly, a stabilitás ellen
ható tényezô, addig a halálozás ""S+" jellege a stabilitás
felé mozgatja a rendszert.
2. A születés (halálozás) valószínûsége (gyakorisága)
független a népesség lélekszámától, annak változásától. Ez
az indifferens, semleges -- ""S0"-val jelölt -- stratégia
az élôvilágban meglehetôsen valószerûtlen, irreális. Más
jelenségeket tekintve, azonban találhatunk példákat. Ilyen
lehet -- a manapság sajnos környezetünkben is aktuálissá
vált -- migráció. A be- és kivándorlás mértéke (és az ennek
következtében elôálló népességváltozás) gyakorlatilag nem a
népesség eredeti számának függvénye, legalábbis bizonyos
határok között. Vagy egy egyszerûbb jelenség: a kémiai
reakciók jelentôs részénél az idôegység alatt
keletkezô/elbomló anyag mennyisége független a komponensek
mennyiségétôl.
3. A születések (halálozások) gyakorisága a populáció
létszámával ellentétes irányban változik. Azaz növekvô
létszám a születések számának csökkenését vonja maga után,
míg a csökkenô létszám növeli a születések és a halálozások
számát. Ez a "kontrastratégia" ""S-" a természetben ha nem
is gyakori, de elôfordul. Gondoljunk csak a sûrû erdôben
egy új facsemete kifejlôdésének valószínûségére, vagy a
csordából kiszakadt növényevôk túlélési esélyére a
ragadozókkal szemben.
Természetesen ez a leírás csak elsô közelítése lehet a
reakciók változatainak, hiszen csak együttjárási
irányokról, elôjelekrôl beszéltünk, és semmit sem mondtunk
a tényezôk közötti összefüggések jellegérôl, erôsségérôl.
Késôbb majd ezt is megtesszük, most mindenesetre lássuk,
hogy milyen módon befolyásolják a különbözô stratégiák a
népesség alakulását, lélekszámának stabilitását, vagy éppen
robbanásszerû változását. Világos, hogy a két "ellenfél"
külön-külön három változatot "játszhat meg", így kilenc fô
esete lehet a "partiknak". Ezeket a játékelméletben
használatos ún. elszámolási mátrixhoz hasonló táblázatban
ábrázolva -- s az eredményeket megelôlegezve -- a következô
képet kapjuk:
születés
S+ S0 S-
h S+ változó stabil stabil
a
l S0 instabil közömbös stabil
á
l S- instabil instabil változó
Mint látható, négy lehetséges esetbe rendezhetô a kilenc
játszma. Mit takarnak ezek a táblázatban feltüntetett
fogalmak?
1. ""Stabil" egy populáció egyensúly esetén, azaz ha a
születés és a halálozás dinamikus egyensúlyban van. A
lélekszám bármilyen irányú változása ellenkezô értelmû
folyamatot indít el a gyakoriság(ok)ban, így a népesség
önmagát szabályozza, spontán módon elkerüli a demográfiai
katasztrófákat. A modell determinisztikusan viselkedik
(nagy elemszám esetén), a jövô kiszámolható (jelezhetô), a
rendszernek van végállapota.
2. ""Közömbös" esetben a lélekszám bármilyen értéket
felvehet, nem érvényesül szabályozó hatás, s így a jövô nem
jósolható, nem determinált, nincs végállapot.
3. ""Instabil" a rendszer, ha az egyensúlytól való
kismértékû elmozdulás úgy befolyásolja a születési,
halálozási gyakoriságokat, hogy azok a megindult változást
erôsítik. A rendszer megállíthatatlanul sodródik a
katasztrófa felé: vagy demográfiai robbanás, vagy a faj
kipusztulása következik be. Megadható olyan kezdôállapot,
melybôl mindkét végállapot elérhetô.
4. A ""változó" rendszer végeredményben az elôzô három
kombinációjaként jön létre. Pontosabban szólva a mennyiségi
összefüggések (azaz a gyakoriságok mértéke, a növekedés
üteme) mutatják meg, hogy a rendszer a fenti három állapot
melyikébe kerül. A sajnálatos(?) csak az, hogy a számunkra
igazán érdekes esetek ebben a "változó" -- nem triviális --
kategóriában találhatók.
Sorozatunk következô részében megvizsgáljuk (megindokoljuk)
ezen négy alapesetet, illetve létrejöttüket, valamint az
egyes növekedési modelleket.
@KBánhegyesi Zoltán@N